#include "Thread.hpp"
#include <iostream>

using std::cout;
using std::endl;


namespace wd
{
//cb在构造函数中是一个左值，所以要表达
//移动语义就要使用std::move
Thread::Thread(ThreadCallback && cb)
: _pthid(0)
, _isRunning(false)
, _cb(std::move(cb))
{}

void Thread::start()
{
    if(!_isRunning) {
        //第四个参数传递的就是指向线程对象的this指针
        pthread_create(&_pthid, NULL, start_routine, this);
        _isRunning = true;
    }
}

//start_routine是一个静态的成员函数, 没有this指针
//而this指针代表的是当前对象
void * Thread::start_routine(void * arg)
{
    //子线程内部一定要调用_cb函数对象, 这意味着需要获取到线程对象
    Thread * pthread = static_cast<Thread*>(arg);
    if(pthread) {
        pthread->_cb();
    }
    return NULL;
}

void Thread::join()
{
    if(_isRunning) {
        pthread_join(_pthid, nullptr);
        _isRunning = false;
    }
}


}//end of namespace wd
